home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / pcd2 / src / pcd_ms.has < prev    next >
Text File  |  1997-02-06  |  9KB  |  468 lines

  1. **************************************************
  2. * マウス関連サブルーチン
  3. *
  4. * 実行形式・ソース共、利用に制限はありませんが
  5. * 無保証であることだけは保証します
  6. *                 by まる丸 1997
  7. **************************************************
  8.  
  9.  
  10. *------------------------------
  11. * インクルード&外部参照
  12. *------------------------------
  13.  
  14.     .include    iocscall.mac
  15.     .include    c:\free\agiocs\agiocs.mac
  16.  
  17.     .xref    V_FLAME
  18.     .xref    SW_S,SW_LX,SW_LY
  19.     .xref    M_TBL_X,M_TBL_Y,M_TBL_J,SEL
  20.     .xdef    MS_INIT,MS_CHECK,MScsrON,MScsrOFF
  21.     .xdef    G_MODE,limitB
  22.  
  23. *------------------------------
  24. * プログラム部
  25. *------------------------------
  26.     .cpu    68000
  27.     .text
  28.     .align    4
  29.  
  30. *------------------------------
  31. * マウスの初期設定
  32. *------------------------------
  33. MS_INIT:
  34.     movem.l    d0-d1,-(sp)
  35.     clr.b    MS_FLG
  36.     tst.l    V_FLAME
  37.     bmi    @f
  38.     clr.w    limitB
  39.     moveq.l    #-1,d1
  40.     IOCS    _CRTMOD
  41.     cmpi.b    #12,d0
  42.     beq    2f
  43.     move.b    #3,G_MODE
  44.     move.w    #767,limitE
  45.     bra    1f
  46. 2:    move.b    #2,G_MODE
  47.     move.w    #767,limitE
  48.     bra    1f
  49. @@:    tst.b    SW_S
  50.     bne    @f
  51.     clr.w    limitB
  52.     move.w    #511,limitE
  53.     clr.b    G_MODE
  54.     bra    1f
  55. @@:    move.w    #128,limitB
  56.     move.w    #639,limitE
  57.     move.b    #1,G_MODE
  58. 1:    IOCS    _MS_CURGT        *マウスカーソルの位置ゲット
  59.     cmpi.w    #511,d0
  60.     bls    @f
  61.     move.w    #500,d0
  62. @@:    swap    d0
  63.     cmp.w    limitB,d0
  64.     bcc    @f
  65.     move.w    SW_LX,d0
  66.     add.w    #10,d0
  67.     bra    1f
  68. @@:    cmp.w    limitE,d0
  69.     bls    1f
  70.     move.w    limitE,d0
  71.     sub.w    #10,d0
  72. 1:    swap    d0
  73.     bsr    MScsrSET
  74.     move.l    d0,MS_X
  75.     clr.b    FLG_MS
  76.     movem.l    (sp)+,d0-d1
  77.     rts
  78.  
  79. *------------------------------
  80. * マウスが押されたかチェック
  81. *------------------------------
  82. MS_CHECK:
  83.     tst.b    MS_FLG
  84.     bne    1f
  85.     bsr    MS_DRAW
  86.     IOCS    _MS_GETDT        *左ボタンが押されているか
  87.     tst.w    d0            *押されていなければ
  88.     bge    1f            *終り
  89. @@:    bsr    MS_DRAW
  90.     IOCS    _MS_GETDT        *左ボタンが押されているか
  91.     tst.w    d0            *押されていれば
  92.     bmi    @b            *離されるまでループ
  93.     bsr    get_num
  94.     rts
  95. 1:    clr.l    d0
  96.     rts
  97.  
  98. *------------------------------
  99. * マウス座標をメニュー番号に変換
  100. *------------------------------
  101. get_num:
  102.     tst.b    FLG_MS
  103.     beq    3f
  104.     movem.l    d1-d4/a0-a1,-(sp)
  105.     tst.b    MS_FLG
  106.     bne    4f
  107.     lea.l    M_TBL_X,a0
  108.     lea.l    M_TBL_Y,a1
  109.     move.w    SEL,d1
  110.     subq.w    #1,d1
  111.     moveq.l    #0,d2
  112.     move.w    MS_X,d3
  113.     move.w    MS_Y,d4
  114. 1:    cmp.w    0(a1,d2.w),d4
  115.     bcs    @f
  116.     cmp.w    2(a1,d2.w),d4
  117.     bhi    @f
  118.     cmp.w    0(a0,d2.w),d3
  119.     bcs    @f
  120.     cmp.w    2(a0,d2.w),d3
  121.     bhi    @f
  122.     lsr.w    #2,d2
  123.     move.l    d2,d0
  124.     addq.l    #1,d0
  125.     bra    2f
  126. @@:    addq.w    #4,d2
  127.     dbra    d1,1b
  128. 4:    moveq.l    #0,d0
  129. 2:    movem.l    (sp)+,d1-d4/a0-a1
  130.     rts
  131. 3:    moveq.l    #1,d0
  132.     rts
  133.  
  134. *------------------------------
  135. * マウスカーソルの描画
  136. *------------------------------
  137. MS_DRAW:
  138.     tst.b    MS_FLG
  139.     bne    1f
  140.     movem.l    d0,-(sp)
  141.     IOCS    _MS_CURGT        *マウスカーソルの位置ゲット
  142.     bsr    MScsrSET        *マウスカーソルの位置セット
  143.     tst.b    FLG_MS            *マウスカーソルは表示されているか?
  144.     beq    @f            *してなければ終わり
  145.     cmp.l    MS_X,d0            *位置は前回と同じか
  146.     beq    @f            *同じなら終わり
  147.     bsr    MScsrOFF        *違ったら一度消して
  148.     move.l    d0,MS_X            *新しい座標で
  149.     bsr    MScsrON            *表示
  150. @@:    move.l    d0,MS_X
  151.     movem.l    (sp)+,d0
  152. 1:    rts
  153.  
  154. *------------------------------
  155. * マウスカーソル表示
  156. *------------------------------
  157. MScsrON:
  158.     tst.b    MS_FLG
  159.     bne    1f
  160.     tst.b    FLG_MS
  161.     bne    1f
  162.     movem.l    d0-d2,-(sp)
  163.     clr.l    d0
  164.     move.w    #12,d2
  165.     move.w    MS_X,d0
  166.     sub.w    limitB,d0        *書き込み開始X座標
  167.     move.w    d0,d1
  168.     add.w    d2,d1
  169.     sub.w    limitE,d1
  170.     add.w    limitB,d1
  171.     subq.w    #1,d1
  172.     ble    @f
  173.     sub.w    d1,d2            *マウスの横ドット数
  174. @@:    swap    d2
  175.     move.w    #16,d2
  176.     move.w    MS_Y,d1            *書き込み開始Y座標
  177.     add.w    d2,d1
  178.     sub.w    #512,d1
  179.     ble    @f
  180.     sub.w    d1,d2            *マウスの縦ドット数
  181. @@:    move.l    d2,MS_sx
  182.     tst.l    V_FLAME
  183.     bge    @f
  184.     clr.l    d1
  185.     move.w    MS_Y,d1            *Y座標を
  186.     swap    d1            *1024倍して
  187.     lsr.l    #6,d1
  188.     add.w    d0,d0            *X座標を2倍した数値を
  189.     add.l    d0,d1            *足し算し
  190.     add.l    #$c00000,d1        *G-RAMの先頭アドレスを足せば
  191.     move.l    d1,MS_ADR        *書き込み開始アドレスになる
  192. @@:    bsr    get_gram
  193.     bsr    put_csr
  194.     st.b    FLG_MS
  195.     movem.l    (sp)+,d0-d2
  196. 1:    rts
  197.  
  198. *------------------------------
  199. * グラフィック退避
  200. *------------------------------
  201. get_gram:
  202.     tst.b    MS_FLG
  203.     bne    2f
  204.     tst.l    V_FLAME
  205.     bge    get_GA
  206.     movem.l    d0-d2/a0-a3,-(sp)
  207.     suba.l    a1,a1
  208.     IOCS    _B_SUPER
  209.     move.l    d0,a3
  210.     move.l    MS_ADR,a0
  211.     move.l    a0,a1
  212.     move.l    MS_sx,d0
  213.     move.w    d0,d2
  214.     subq.w    #1,d2
  215.     swap    d0
  216.     subq.w    #1,d0
  217.     lea.l    MS_BUF,a2
  218. 1:    move.l    a0,a1
  219.     move.w    d0,d1
  220. @@:    move.w    (a1)+,(a2)+
  221.     dbra    d1,@b
  222.     add.l    #1024,a0
  223.     dbra    d2,1b
  224.     move.l    a3,a1
  225.     IOCS    _B_SUPER
  226.     movem.l    (sp)+,d0-d2/a0-a3
  227. 2:    rts
  228.  
  229. get_GA:
  230.     movem.l    d0-d5/a0-a3,-(sp)
  231.     suba.l    a1,a1
  232.     IOCS    _B_SUPER
  233.     move.l    d0,a3
  234.     move.w    MS_sx,d3
  235.     subq.w    #1,d3
  236.     lea.l    MS_BUF,a2
  237.     move.l    MS_X,d4
  238.  
  239. @@:    moveq.l    #15,d5
  240. 1:    move.l    d4,d2
  241.     AGIOCS    _A_G_GETFRM
  242.     move.l    a1,a0
  243.     move.w    d3,d1
  244. @@:    move.w    (a0)+,(a2)+
  245.     move.w    (a0)+,(a2)+
  246.     dbra    d1,@b
  247.     move.l    d0,d2
  248.     AGIOCS    _A_G_SETFRM
  249.     addq.w    #1,d4
  250.     cmpi.w    #512,d4
  251.     dbcc    d5,1b
  252.     move.l    a3,a1
  253.     IOCS    _B_SUPER
  254.     movem.l    (sp)+,d0-d5/a0-a3
  255.     rts
  256.  
  257. *------------------------------
  258. * グラフィック復帰
  259. *------------------------------
  260. put_gram:
  261.     tst.b    MS_FLG
  262.     bne    2f
  263.     tst.l    V_FLAME
  264.     bge    put_GA
  265.     movem.l    d0-d2/a0-a3,-(sp)
  266.     suba.l    a1,a1
  267.     IOCS    _B_SUPER
  268.     move.l    d0,a3
  269.     move.l    MS_ADR,a0
  270.     move.l    a0,a1
  271.     move.l    MS_sx,d0
  272.     move.w    d0,d2
  273.     subq.w    #1,d2
  274.     swap    d0
  275.     subq.w    #1,d0
  276.     lea.l    MS_BUF,a2
  277. 1:    move.l    a0,a1
  278.     move.w    d0,d1
  279. @@:    move.w    (a2)+,(a1)+
  280.     dbra    d1,@b
  281.     add.l    #1024,a0
  282.     dbra    d2,1b
  283.     move.l    a3,a1
  284.     IOCS    _B_SUPER
  285.     movem.l    (sp)+,d0-d2/a0-a3
  286. 2:    rts
  287.  
  288. put_GA:
  289.     movem.l    d0-d5/a0-a3,-(sp)
  290.     suba.l    a1,a1
  291.     IOCS    _B_SUPER
  292.     move.l    d0,a3
  293.     move.w    MS_sx,d3
  294.     subq.w    #1,d3
  295.     lea.l    MS_BUF,a2
  296.     move.l    MS_X,d4
  297.     moveq.l    #15,d5
  298. 1:    move.l    d4,d2
  299.     AGIOCS    _A_G_GETFRM
  300.     move.l    a1,a0
  301.     move.w    d3,d1
  302. @@:    move.w    (a2)+,(a0)+
  303.     move.w    (a2)+,(a0)+
  304.     dbra    d1,@b
  305.     move.l    d0,d2
  306.     AGIOCS    _A_G_SETFRM
  307.     addq.w    #1,d4
  308.     cmpi.w    #512,d4
  309.     dbcc    d5,1b
  310.     move.l    a3,a1
  311.     IOCS    _B_SUPER
  312.     movem.l    (sp)+,d0-d5/a0-a3
  313.     rts
  314.  
  315. *------------------------------
  316. * マウスカーソル書き込み
  317. *------------------------------
  318. put_csr:
  319.     tst.b    MS_FLG
  320.     bne    3f
  321.     tst.l    V_FLAME
  322.     bge    csr_GA
  323.     movem.l    d0-d3/a0-a3,-(sp)
  324.     suba.l    a1,a1
  325.     IOCS    _B_SUPER
  326.     move.l    d0,a3
  327.     move.l    MS_ADR,a0
  328.     move.l    a0,a1
  329.     move.l    MS_sx,d0
  330.     move.w    d0,d2
  331.     subq.w    #1,d2
  332.     swap    d0
  333.     lea.l    MS_data,a2
  334. 1:    move.l    a0,a1
  335.     move.w    d0,d1
  336.     move.w    (a2)+,d3
  337. 2:    subq.w    #1,d1
  338.     bmi    @f
  339.     move.w    (a2),(a1)+
  340. @@:    addq.l    #2,a2
  341.     dbra    d3,2b
  342.     add.l    #1024,a0
  343.     dbra    d2,1b
  344.     move.l    a3,a1
  345.     IOCS    _B_SUPER
  346.     movem.l    (sp)+,d0-d3/a0-a3
  347. 3:    rts
  348.  
  349. csr_GA:
  350.     movem.l    d0-d6/a0-a3,-(sp)
  351.     suba.l    a1,a1
  352.     IOCS    _B_SUPER
  353.     move.l    d0,a3
  354.     lea.l    MS_data,a2
  355.     move.w    MS_sx,d3
  356.     move.l    MS_X,d4
  357.     moveq.l    #15,d6
  358. 1:    move.l    d4,d2
  359.     AGIOCS    _A_G_GETFRM
  360.     move.l    a1,a0
  361.     move.w    d3,d1
  362.     move.w    (a2)+,d5
  363. 2:    subq.w    #1,d1
  364.     bmi    @f
  365.     move.w    (a2),(a0)+
  366.     move.w    (a2),(a0)+
  367. @@:    addq.l    #2,a2
  368.     dbra    d5,2b
  369.     move.l    d0,d2
  370.     AGIOCS    _A_G_SETFRM
  371.     addq.l    #1,d4
  372.     cmpi.w    #512,d4
  373.     dbcc    d6,1b
  374.     move.l    a3,a1
  375.     IOCS    _B_SUPER
  376.     movem.l    (sp)+,d0-d6/a0-a3
  377.     rts
  378.  
  379. *------------------------------
  380. * マウスカーソル消去
  381. *------------------------------
  382. MScsrOFF:
  383.     tst.b    FLG_MS
  384.     beq    @f
  385.     bsr    put_gram
  386.     clr.b    FLG_MS
  387. @@:    rts
  388.  
  389. *------------------------------
  390. * マウスの座標指定
  391. *------------------------------
  392. MScsrSET:
  393.     tst.b    MS_FLG
  394.     bne    2f
  395.     movem.l    d1-d2,-(sp)
  396.     cmpi.w    #511,d0
  397.     bls    @f
  398.     move.w    #511,d0
  399. @@:    swap    d0
  400.     cmp.w    limitB,d0
  401.     bcc    @f
  402.     move.w    limitB,d0
  403.     bra    1f
  404. @@:    cmp.w    limitE,d0
  405.     bls    1f
  406.     move.w    limitE,d0
  407. 1:    swap    d0
  408.     move.l    d0,d2
  409.     move.l    d0,d1
  410.     IOCS    _MS_CURST
  411.     tst.l    d0
  412.     bge    @f
  413.     st.b    MS_FLG        *マウス使用不可
  414. @@:    cmpi.b    #2,G_MODE
  415.     bne    @f
  416.     swap    d2
  417.     move.w    d2,d0
  418.     add.w    d2,d2
  419.     add.w    d0,d2
  420.     lsr.w    #1,d2
  421.     swap    d2
  422. @@:    exg    d2,d0
  423.     movem.l    (sp)+,d1-d2
  424.     rts
  425. 2:    clr.l    d0
  426.     rts
  427.  
  428. *------------------------------
  429. * 固定データ部
  430. *------------------------------
  431.     .data
  432.     .align    4
  433. MS_data:
  434.     .dc.w     0, 0
  435.     .dc.w     1, 0, 0
  436.     .dc.w     2, 0,-1, 0
  437.     .dc.w     3, 0,-1,-1, 0
  438.     .dc.w     4, 0,-1,-1,-1, 0
  439.     .dc.w     5, 0,-1,-1,-1,-1, 0
  440.     .dc.w     6, 0,-1,-1,-1,-1,-1, 0
  441.     .dc.w     7, 0,-1,-1,-1,-1,-1,-1, 0
  442.     .dc.w     8, 0,-1,-1,-1,-1,-1,-1,-1, 0
  443.     .dc.w     9, 0,-1,-1,-1,-1,-1,-1,-1,-1, 0
  444.     .dc.w    10, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0
  445.     .dc.w    11, 0,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0
  446.     .dc.w     3, 0,-1,-1, 0
  447.     .dc.w     2, 0,-1, 0
  448.     .dc.w     1, 0, 0
  449.     .dc.w     0, 0
  450.  
  451. *------------------------------
  452. * ワークエリア
  453. *------------------------------
  454.     .bss
  455.     .align    4
  456. MS_limit:
  457. limitB:    .ds.w    1            *マウスX方向の移動範囲
  458. limitE:    .ds.w    1            *マウスX方向の移動範囲
  459. MS_X:    .ds.w    1            *マウスのX座標
  460. MS_Y:    .ds.w    1            *マウスのY座標
  461. MS_sx:    .ds.w    1            *マウスカーソルの横サイズ
  462. MS_sy:    .ds.w    1            *マウスカーソルの縦サイズ
  463. MS_ADR:    .ds.l    1
  464. MS_BUF:    .ds.l    384            *12x16
  465. FLG_MS:    .ds.b    1
  466. MS_FLG:    .ds.b    1            *0=マウス使用可能 0以外使用不能
  467. G_MODE:    .ds.b    1            *3:2=0 1:1=1 GA3:2=2 GA1:1=3
  468.